package models

import (
	"fmt"
	"time"
)

//功能 人物对怪的伤害,或者对指定区域的伤害
//注意，当前没有闪避率等操作
func (rt *RunTime) 人物攻击内容(技能信息 *Struct技能信息, 技能 *Struct技能列表, 实时技能 *Struct实时技能信息, 技能等级 uint16, 被攻击内容 *StructMap, X, Y, Z int32) {
	//var B等级 uint16
	var 内容S []*StructMap
	if 被攻击内容 != nil {
		if rt.V角色内容.V空间.F计算两点距离(被攻击内容.X, 被攻击内容.Y, rt.V角色内容.X, rt.V角色内容.Y) <= 实时技能.V攻击距离 {
			内容S = append(内容S, 被攻击内容)
		} else {
			return
		}
	}
	if 实时技能.V攻击半径 != 0 { //如果是范围攻击
		内容列表 := rt.V角色内容.V空间.F找到指定位置四周内容(X, Y, 实时技能.V攻击半径, uint8(E类别_人物)|uint8(E类别_怪物))
		for _, v := range 内容列表 {
			switch v.V类别 {
			case E类别_人物:
				if rt.V角色.VPK == true {
					if v.Id == rt.V角色内容.Id { //自己的不要
						continue
					}
					内容S = append(内容S, v)
				}
			case E类别_怪物:
				内容S = append(内容S, v)
			}

		}
	}
	if 武器ID, ok := rt.V角色.V佩戴物品[E位置_武器]; ok == true {
		if 武器, ok := rt.V物品列表[武器ID]; ok == true {
			if 武器.V当前耐久 > 0 {
				if rt.V角色.VPK == true {
					武器.V当前耐久 -= 0.1
				} else {
					武器.V当前耐久 -= 0.01
				}
				武器.Stata.V修改 = true
				武器.Stata.V更新字段["V当前耐久"] = true
				if 武器.V当前耐久 == 0 {
					rt.角色_属性计算(false)
				}
			}
		}
	}
	角色复制属性 := make(map[uint16]float32)
	switch 技能信息.V攻击类型 {
	case 0:
		for k, v := range rt.V物理攻击属性 {
			角色复制属性[k] = v
		}
	case 1:
		for k, v := range rt.V物理魔法攻击属性 {
			角色复制属性[k] = v
		}
	case 2:
		for k, v := range rt.V魔法攻击属性 {
			角色复制属性[k] = v
		}
	default:
		for k, v := range 实时技能.V基础属性 {
			角色复制属性[k] = v
		}
	}
	//多次攻击的需要平分
	if 实时技能.V攻击次数 > 1 {
		for k, v := range 角色复制属性 {
			v /= float32(实时技能.V攻击次数)
			角色复制属性[k] = v
		}
	}
	for _, 内容 := range 内容S {
		if 内容 == nil {
			continue
		}
		if 内容.V是否死亡 == true {
			continue
		}
		F地图_发送信息(内容, &S交换数据{
			V类型:  E交换数据类型_攻击,
			V发送人: rt.V角色内容,
			V内容:  角色复制属性,
		})
	}
}
func (rt *RunTime) 攻击_人物攻击处理(攻击目标 *StructMap, 攻击序号, x, y, z int32, 技能信息 *Struct技能信息, 技能 *Struct技能列表, 实时技能 *Struct实时技能信息) {
	m := rt.V角色内容
	差时 := time.Now().Sub(技能.V最后时间).Seconds()
	攻击速度 := 60 / (float64(实时技能.V攻击速度)*0.04 + 6)
	if 差时 < 攻击速度 { //如果与上次的攻击还没有处理完，这次不能攻击
		if 技能.V攻击次数累计 > 实时技能.V攻击次数 {
			rt.消息_系统消息(3, fmt.Sprintf("技能时间未到,差时:%f,攻击速度:%d", 差时, 实时技能.V攻击速度))
			return
		}
		技能.V攻击次数累计++
	}
	rt.技能_增加经验(技能信息, 技能, 1)
	if 技能信息.V辅助ID != 0 {
		/*CMD 0A,,3B 01 05 00 00 00 57 61 72 6D 00 1F D1 A7 5A 01 00 00 00 00 05 00 00 00 4E 6F 6E 65 00 */
		if 技能信息.V辅助自己 == true {
			攻击目标 = rt.V角色内容
		}
		if 攻击目标 != nil {
			//rt.消息_系统消息(3, "使用技能"+技能信息.V技能中文名+",时长"+strconv.Itoa(int(实时技能.V辅助时长)))
			F地图_发送信息(攻击目标, &S交换数据{
				V类型:  E交换数据类型_修改辅助技能,
				V发送人: m,
				V内容: S额外属性{
					V到期时间:  time.Now().Add(time.Duration(实时技能.V辅助时长) * time.Second),
					V唯一ID:  技能信息.V辅助ID,
					V技能英文名: 技能信息.V技能英文名,
					V添加内容:  实时技能.V基础属性},
			})
		}
		return
	} else {
		if 实时技能.V攻击半径 != 0 {
			if 技能信息.V滞留技能 == false { //不滞留的进行攻击
				rt.人物攻击内容(技能信息, 技能, 实时技能, 技能.V技能等级, 攻击目标, x, y, z)
				//rt.技能_使用指定ID攻击内容(怪物ID, 技能信息, 技能, 实时技能, x, y, z)
			} else {
				go func(技能信息 *Struct技能信息, X, Y, Z int32) {
					//先在地上显示技能图标
					地图内容 := rt.V角色内容.V空间.F添加内容(E类别_技能, X, Y, Z, 0, 技能信息)
					for i := uint8(0); i < 实时技能.V攻击次数; i++ {
						//rt.技能_使用指定ID攻击内容(怪物ID, 技能信息, 技能, 实时技能, X, Y, Z)
						rt.人物攻击内容(技能信息, 技能, 实时技能, 技能.V技能等级, 攻击目标, X, Y, Z)
						t := int(实时技能.V辅助时长)
						t *= 1000
						t /= int(实时技能.V攻击次数)
						time.Sleep(time.Duration(t) * time.Millisecond)
					}
					rt.V角色内容.V空间.F删除内容(地图内容.Id)
				}(技能信息, x, y, z)
			}
		} else {
			//rt.技能_使用指定ID攻击内容(怪物ID, 技能信息, 技能, 实时技能, x, y, z)
			rt.人物攻击内容(技能信息, 技能, 实时技能, 技能.V技能等级, 攻击目标, x, y, z)

		}
	}
}
func (rt *RunTime) 攻击_处理使用技能(步骤 uint8, 技能信息 *Struct技能信息, 目标 *StructMap, 攻击序号 int32, 坐标X, 坐标Y, 坐标Z int32) {
	实时技能, _ := rt.技能_获取实时技能列表(技能信息.V技能英文名)
	技能, ok := rt.V技能列表[技能信息.Id]
	if ok == false {
		rt.消息_系统消息(3, "未学会技能:"+技能信息.V技能中文名)
		return
	}
	if 步骤 == 1 { //只有在步骤1时才会减蓝量和技能检测
		时间 := time.Now().Sub(技能.V最后时间).Seconds()
		if 时间 < float64(实时技能.V冷却时间) { //如果与上次的攻击还没有处理完，这次不能攻击
			rt.消息_系统消息(3, "技能未冷却")
			return
		}
		蓝量 := rt.V角色内容.V基础属性[E基础属性_当前蓝量]
		if uint32(蓝量) < 实时技能.V魔法消耗 {
			return
		}
		技能.V最后时间 = time.Now()
		技能.V攻击次数累计 = 1 //第一次
		技能.V攻击序号 = 攻击序号

		蓝量 -= float32(实时技能.V魔法消耗)
		rt.V角色内容.V基础属性[E基础属性_当前蓝量] = 蓝量
		rt.发送用户信息(用户信息_蓝量)
		if 目标 != nil {
			switch 技能信息.V攻击类型 {
			case 0, 1:
				rt.动作_人物攻击内容(rt.V角色内容.Id, 目标.Id, 坐标X, 坐标Y, 技能信息.V技能中文名)
			case 2:
				动作_魔法攻击起手式(rt.V角色内容, 技能信息.V技能英文名, 目标.Id, 坐标X, 坐标Y, 坐标Z, 0)
			}
		}
	}
	if 技能信息.V步骤 == 步骤 {
		rt.攻击_人物攻击处理(目标, 0, 坐标X, 坐标Y, 坐标Z, 技能信息, 技能, 实时技能)
		switch 技能信息.V攻击类型 {
		//$
		case 2:
			if 目标 != nil {
				rt.动作_远程物理攻击(rt.V角色内容.Id, 目标.Id, 坐标X, 坐标Y, 技能信息.V技能英文名)
			}
		}

	}
}
